/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.lista05;

import java.util.Scanner;
import java.util.Vector;

/**
 *
 * @author mendel
 */
public class AgendaVector implements Repositorio{
    Scanner s = new Scanner(System.in);
    Vector<Tarefa> tarefas = new Vector<Tarefa>();
    
    @Override
    public boolean cadastrarTarefa(int opcaoTipoTarefa, int opcaoTarefa) throws ImportanciaException
    {
        if (opcaoTipoTarefa == 1 || opcaoTipoTarefa == 2) 
        {
            if (opcaoTarefa == 1) 
            {
                int wCodigo = s.nextInt();
                String wDescricao = s.next();
                String wData = s.next();
                int wDuracao = s.nextInt();
                String wLocal = s.next();
                if(opcaoTipoTarefa == 1)
                {
                    tarefas.add(new TarefaGerencial(wCodigo, wDescricao, wData, wDuracao, wLocal));
                    return true;
                }
                else
                {
                    tarefas.add(new TarefaDesenvolvimento(wCodigo, wDescricao, wData, wDuracao, wLocal));
                    return true;
                }  
            }
            else if (opcaoTarefa == 2) 
            {
                int wCodigo = s.nextInt();
                String wDescricao = s.next();
                String wData = s.next();
                int wDuracao = s.nextInt();
                String wLocal = s.next();
                int wImportancia = 0;
                while (true)
                {
                    wImportancia = s.nextInt();
                    if (wImportancia < 1 || wImportancia > 5) 
                    {
                        throw new ImportanciaException();
                    }
                    else 
                    {
                        break;
                    }
                }
                int wUrgencia = 0;
                while (true) 
                {
                    wUrgencia = s.nextInt();
                    if (wUrgencia < 1 || wUrgencia > 5) 
                    {
                        throw new ImportanciaException();
                    }
                    else 
                    {
                        break;
                    }
                }
                double wValorHora = s.nextDouble();
                if (opcaoTipoTarefa == 1) 
                {
                    tarefas.add(new TarefaGerencial(wCodigo, wDescricao, wData, wDuracao, wLocal, wImportancia, wUrgencia, wValorHora));
                    return true;
                } 
                else 
                {
                    tarefas.add(new TarefaDesenvolvimento(wCodigo, wDescricao, wData, wDuracao, wLocal, wImportancia, wUrgencia, wValorHora));
                    return true;
                }
            }
            return false;
        }
        else
        {
            if (opcaoTarefa == 1) 
            {
                String wDescricao = s.next();
                String wData = s.next();
                int wDuracao = s.nextInt();
                String wLocal = s.next();
                tarefas.add(new TarefaDesenvolvimentoAuto(wDescricao, wData, wDuracao, wLocal));
                return true;
            }
            else if (opcaoTarefa == 2) 
            {
                String wDescricao = s.next();
                String wData = s.next();
                int wDuracao = s.nextInt();
                String wLocal = s.next();
                int wImportancia = 0;
                while (true) 
                {
                    wImportancia = s.nextInt();
                    if (wImportancia < 1 || wImportancia > 5) 
                    {
                        throw new ImportanciaException();
                    } 
                    else
                    {
                        break;
                    }
                }
                int wUrgencia = 0;
                while (true) 
                {
                    wUrgencia = s.nextInt();
                    if (wUrgencia < 1 || wUrgencia > 5) 
                    {
                        throw new ImportanciaException();
                    } 
                    else 
                    {
                        break;
                    }
                }
                double wValorHora = s.nextDouble();
                tarefas.add(new TarefaDesenvolvimentoAuto(wDescricao, wData, wDuracao, wLocal, wImportancia, wUrgencia, wValorHora));
                return true;
            }
            return false;
        }
    }
    @Override
    public boolean removerTarefa(int codTarefa) throws SemTarefaException
    {
        if(tarefas.isEmpty())
        {
            throw new SemTarefaException();
        }
        else
        {
            for (int y = 0; y < tarefas.size(); y++)
            {
                if (tarefas.get(y).getCodigo() == codTarefa)
                {
                    tarefas.remove(y);
                    return true;
                } 
                else
                {
                    continue;
                }
            }
            return false;
        }
    }
    @Override
    public TarefaTO consultarTarefa(int codTarefa) throws SemTarefaException
    {
        TarefaTO tarefaAux = null;
        if(tarefas.isEmpty())
        {
            throw new SemTarefaException();
        }
        else
        {
            for (int y = 0; y < tarefas.size(); y++) 
            {
                if (tarefas.get(y).getCodigo() == codTarefa) 
                {
                    tarefaAux = new TarefaTO(tarefas.get(y).getCodigo(),
                            tarefas.get(y).getDescricao(),
                            tarefas.get(y).getData(),
                            tarefas.get(y).getDuracao(),
                            tarefas.get(y).getLocal(),
                            tarefas.get(y).getImportancia(),
                            tarefas.get(y).getUrgencia(),
                            tarefas.get(y).getValorHora());
                    tarefaAux.setValorCobrado(tarefas.get(y).getValorCobrado());
                    tarefaAux.setStatus(tarefas.get(y).getStatus());
                    return tarefaAux;
                } 
                else 
                {
                    continue;
                }
            }
            return tarefaAux;
        }    
    }
    @Override
    public TarefaTO[] listarTarefa()
    {
        TarefaTO[] arrayAux = null;
        if(tarefas.isEmpty())
        {
            return arrayAux;
        }
        else
        {
            int i = 0;
            for(int y = 0; y < tarefas.size(); y++)
            {
                arrayAux[i] = new TarefaTO(tarefas.get(y).getCodigo(),
                                           tarefas.get(y).getDescricao(),
                                           tarefas.get(y).getData(),
                                           tarefas.get(y).getDuracao(),
                                           tarefas.get(y).getLocal());
                i++;              
            }
            return arrayAux;
        } 
    }
    @Override
    public boolean iniciarTarefa(int codigo) throws SemTarefaException
    {        
        if(tarefas.isEmpty())
        {
            throw new SemTarefaException();
        }
        else
        {
            for (int y = 0; y < tarefas.size(); y++) 
            {
                if (tarefas.get(y).getCodigo() == codigo) 
                {
                    tarefas.get(y).iniciarTarefa();
                    return true;
                } 
                else 
                {
                    continue;
                }
            }
            return false;
        }
    }
    @Override
    public boolean encerrarTarefa(int codigo, double wValorCobrado) throws SemTarefaException
    {        
        if(tarefas.isEmpty())
        {
            throw new SemTarefaException();
        }
        else
        {
            for (int y = 0; y < tarefas.size(); y++) 
            {
                if (tarefas.get(y).getCodigo() == codigo) 
                {
                    tarefas.get(y).encerrarTarefa(wValorCobrado);
                    return true;
                } 
                else 
                {
                    continue;
                }
            }
            return false;
        }
    }
    @Override
    public boolean alterarImportancia(int codigo, int wOpcao) throws SemTarefaException
    {
        if(tarefas.isEmpty())
        {
            throw new SemTarefaException();
        }
        else
        {
            for (int y = 0; y < tarefas.size(); y++) 
            {
                if (tarefas.get(y).getCodigo() != codigo) 
                {
                    continue;
                } 
                else 
                {
                    if (wOpcao == 1) 
                    {
                        tarefas.get(y).incrementaImportancia();
                        return true;
                    }
                    else if (wOpcao == 2)
                    {
                        tarefas.get(y).decrementaImportancia();
                        return true;
                    }
                }
            }
        }
        return false;
    }
    @Override
    public boolean cancelarTarefa(int codigo) throws SemTarefaException
    {
        if(tarefas.isEmpty())
        {
            throw new SemTarefaException();
        }
        else
        {
            for (int y = 0; y < tarefas.size(); y++) 
            {
                if (tarefas.get(y).getCodigo() != codigo) 
                {
                    continue;
                } 
                else 
                {
                    tarefas.get(y).cancelarTarefa();
                    return true;
                }
            }
        }
        return false;
    }
    public boolean reiniciarTarefa(int codigo) throws SemTarefaException, SemMetodoException
    {
        TarefaDesenvolvimento tarefaDesenv;
        if(tarefas.isEmpty())
        {
            throw new SemTarefaException();
        }
        else
        {
            for (int y = 0; y < tarefas.size(); y++) 
            {
                if (tarefas.get(y).getCodigo() != codigo) 
                {
                    continue;
                } 
                else 
                {
                    if(tarefas.get(y) instanceof TarefaDesenvolvimento)
                    {
                        tarefaDesenv = (TarefaDesenvolvimento)tarefas.get(y);
                        tarefaDesenv.reiniciarTarefa();
                        return true;
                    }
                    else
                    {
                        throw new SemMetodoException();
                    }
                }
            }
        }
        return false;
    }
}
